<!-- HTML header for doxygen 1.8.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<title>OpenCV: Laplace Operator</title>
<link href="../../opencv.ico" rel="shortcut icon" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="../../tutorial-utils.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
//<![CDATA[
MathJax.Hub.Config(
{
  TeX: {
      Macros: {
          matTT: [ "\\[ \\left|\\begin{array}{ccc} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{array}\\right| \\]", 9],
          fork: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ \\end{array} \\right.", 4],
          forkthree: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ \\end{array} \\right.", 6],
          forkfour: ["\\left\\{ \\begin{array}{l l} #1 & \\mbox{#2}\\\\ #3 & \\mbox{#4}\\\\ #5 & \\mbox{#6}\\\\ #7 & \\mbox{#8}\\\\ \\end{array} \\right.", 8],
          vecthree: ["\\begin{bmatrix} #1\\\\ #2\\\\ #3 \\end{bmatrix}", 3],
          vecthreethree: ["\\begin{bmatrix} #1 & #2 & #3\\\\ #4 & #5 & #6\\\\ #7 & #8 & #9 \\end{bmatrix}", 9],
          cameramatrix: ["#1 = \\begin{bmatrix} f_x & 0 & c_x\\\\ 0 & f_y & c_y\\\\ 0 & 0 & 1 \\end{bmatrix}", 1],
          distcoeffs: ["(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \\tau_x, \\tau_y]]]]) \\text{ of 4, 5, 8, 12 or 14 elements}"],
          distcoeffsfisheye: ["(k_1, k_2, k_3, k_4)"],
          hdotsfor: ["\\dots", 1],
          mathbbm: ["\\mathbb{#1}", 1],
          bordermatrix: ["\\matrix{#1}", 1]
      }
  }
}
);
//]]>
</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<!--#include virtual="/google-search.html"-->
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="../../opencv-logo-small.png"/></td>
  <td style="padding-left: 0.5em;">
   <div id="projectname">OpenCV
   &#160;<span id="projectnumber">4.5.2</span>
   </div>
   <div id="projectbrief">Open Source Computer Vision</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('../../',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="../../d9/df8/tutorial_root.html">OpenCV Tutorials</a></li><li class="navelem"><a class="el" href="../../d7/da8/tutorial_table_of_content_imgproc.html">Image Processing (imgproc module)</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">Laplace Operator </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p><b>Prev Tutorial:</b> <a class="el" href="../../d2/d2c/tutorial_sobel_derivatives.html">Sobel Derivatives</a></p>
<p><b>Next Tutorial:</b> <a class="el" href="../../da/d5c/tutorial_canny_detector.html">Canny Edge Detector</a></p>
<table class="doxtable">
<tr>
<th align="right"></th><th align="left"></th></tr>
<tr>
<td align="right">Original author </td><td align="left">Ana Huamán </td></tr>
<tr>
<td align="right">Compatibility </td><td align="left">OpenCV &gt;= 3.0 </td></tr>
</table>
<h2>Goal </h2>
<p>In this tutorial you will learn how to:</p>
<ul>
<li>Use the OpenCV function <b><a class="el" href="../../d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6" title="Calculates the Laplacian of an image. ">Laplacian()</a></b> to implement a discrete analog of the <em>Laplacian operator</em>.</li>
</ul>
<h2>Theory </h2>
<ol type="1">
<li><p class="startli">In the previous tutorial we learned how to use the <em>Sobel Operator</em>. It was based on the fact that in the edge area, the pixel intensity shows a "jump" or a high variation of intensity. Getting the first derivative of the intensity, we observed that an edge is characterized by a maximum, as it can be seen in the figure:</p>
<div class="image">
<img src="../../Laplace_Operator_Tutorial_Theory_Previous.jpg" alt="Laplace_Operator_Tutorial_Theory_Previous.jpg"/>
</div>
</li>
<li><p class="startli">And...what happens if we take the second derivative?</p>
<div class="image">
<img src="../../Laplace_Operator_Tutorial_Theory_ddIntensity.jpg" alt="Laplace_Operator_Tutorial_Theory_ddIntensity.jpg"/>
</div>
<p class="startli">You can observe that the second derivative is zero! So, we can also use this criterion to attempt to detect edges in an image. However, note that zeros will not only appear in edges (they can actually appear in other meaningless locations); this can be solved by applying filtering where needed.</p>
</li>
</ol>
<h3>Laplacian Operator</h3>
<ol type="1">
<li>From the explanation above, we deduce that the second derivative can be used to <em>detect edges</em>. Since images are "*2D*", we would need to take the derivative in both dimensions. Here, the Laplacian operator comes handy.</li>
<li><p class="startli">The <em>Laplacian operator</em> is defined by:</p>
<p class="formulaDsp">
\[Laplace(f) = \dfrac{\partial^{2} f}{\partial x^{2}} + \dfrac{\partial^{2} f}{\partial y^{2}}\]
</p>
</li>
<li>The Laplacian operator is implemented in OpenCV by the function <b><a class="el" href="../../d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6" title="Calculates the Laplacian of an image. ">Laplacian()</a></b> . In fact, since the Laplacian uses the gradient of images, it calls internally the <em>Sobel</em> operator to perform its computation.</li>
</ol>
<h2>Code </h2>
<ol type="1">
<li><b>What does this program do?</b><ul>
<li>Loads an image</li>
<li>Remove noise by applying a Gaussian blur and then convert the original image to grayscale</li>
<li>Applies a Laplacian operator to the grayscale image and stores the output image</li>
<li>Display the result in a window</li>
</ul>
</li>
</ol>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'><ol type="1">
<li>The tutorial code's is shown lines below. You can also download it from <a href="https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp">here</a> <div class="fragment"><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d1/d4f/imgproc_2include_2opencv2_2imgproc_8hpp.html">opencv2/imgproc.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d6/d87/imgcodecs_8hpp.html">opencv2/imgcodecs.hpp</a>&quot;</span></div><div class="line"><span class="preprocessor">#include &quot;<a class="code" href="../../d4/dd5/highgui_8hpp.html">opencv2/highgui.hpp</a>&quot;</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span><a class="code" href="../../d2/d75/namespacecv.html">cv</a>;</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main( <span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>** argv )</div><div class="line">{</div><div class="line">    <span class="comment">// Declare the variables we are going to use</span></div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> src, src_gray, dst;</div><div class="line">    <span class="keywordtype">int</span> kernel_size = 3;</div><div class="line">    <span class="keywordtype">int</span> scale = 1;</div><div class="line">    <span class="keywordtype">int</span> delta = 0;</div><div class="line">    <span class="keywordtype">int</span> ddepth = <a class="code" href="../../d1/d1b/group__core__hal__interface.html#ga9d2ee1a8334733dea7482a47a88e0f87">CV_16S</a>;</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span>* window_name = <span class="stringliteral">&quot;Laplace Demo&quot;</span>;</div><div class="line"></div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = argc &gt;=2 ? argv[1] : <span class="stringliteral">&quot;lena.jpg&quot;</span>;</div><div class="line"></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>( <a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">samples::findFile</a>( imageName ), <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80af660544735200cbe942eea09232eb822">IMREAD_COLOR</a> ); <span class="comment">// Load an image</span></div><div class="line"></div><div class="line">    <span class="comment">// Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span>(src.<a class="code" href="../../d3/d63/classcv_1_1Mat.html#abbec3525a852e77998aba034813fded4">empty</a>()){</div><div class="line">        printf(<span class="stringliteral">&quot; Error opening image\n&quot;</span>);</div><div class="line">        printf(<span class="stringliteral">&quot; Program Arguments: [image_name -- default lena.jpg] \n&quot;</span>);</div><div class="line">        <span class="keywordflow">return</span> -1;</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="comment">// Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )</span></div><div class="line">    <a class="code" href="../../d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1">GaussianBlur</a>( src, src, <a class="code" href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">Size</a>(3, 3), 0, 0, <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5afe14c13a4ea8b8e3b3ef399013dbae01">BORDER_DEFAULT</a> );</div><div class="line"></div><div class="line">    <a class="code" href="../../d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab">cvtColor</a>( src, src_gray, <a class="code" href="../../d8/d01/group__imgproc__color__conversions.html#gga4e0972be5de079fed4e3a10e24ef5ef0a353a4b8db9040165db4dacb5bcefb6ea">COLOR_BGR2GRAY</a> ); <span class="comment">// Convert the image to grayscale</span></div><div class="line"><span class="comment"></span></div><div class="line">    <a class="code" href="../../d3/d63/classcv_1_1Mat.html">Mat</a> abs_dst;</div><div class="line">    <a class="code" href="../../d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6">Laplacian</a>( src_gray, dst, ddepth, kernel_size, scale, delta, <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5afe14c13a4ea8b8e3b3ef399013dbae01">BORDER_DEFAULT</a> );</div><div class="line"></div><div class="line">    <span class="comment">// converting back to CV_8U</span></div><div class="line">    <a class="code" href="../../d2/de8/group__core__array.html#ga3460e9c9f37b563ab9dd550c4d8c4e7d">convertScaleAbs</a>( dst, abs_dst );</div><div class="line"></div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563">imshow</a>( window_name, abs_dst );</div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">waitKey</a>(0);</div><div class="line"></div><div class="line">    <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment -->  </div> </li>
</ol>
 <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'><ol type="1">
<li>The tutorial code's is shown lines below. You can also download it from <a href="https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgTrans/LaPlace/LaplaceDemo.java">here</a> <div class="fragment"><div class="line"></div><div class="line"><span class="keyword">import</span> org.opencv.core.*;</div><div class="line"><span class="keyword">import</span> org.opencv.highgui.HighGui;</div><div class="line"><span class="keyword">import</span> org.opencv.imgcodecs.Imgcodecs;</div><div class="line"><span class="keyword">import</span> org.opencv.imgproc.Imgproc;</div><div class="line"></div><div class="line"><span class="keyword">class </span>LaplaceDemoRun {</div><div class="line"></div><div class="line">    <span class="keyword">public</span> <span class="keywordtype">void</span> run(<a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a>[] args) {</div><div class="line">        <span class="comment">// Declare the variables we are going to use</span></div><div class="line">        Mat src, src_gray = <span class="keyword">new</span> Mat(), dst = <span class="keyword">new</span> Mat();</div><div class="line">        <span class="keywordtype">int</span> kernel_size = 3;</div><div class="line">        <span class="keywordtype">int</span> scale = 1;</div><div class="line">        <span class="keywordtype">int</span> delta = 0;</div><div class="line">        <span class="keywordtype">int</span> ddepth = CvType.CV_16S;</div><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> window_name = <span class="stringliteral">&quot;Laplace Demo&quot;</span>;</div><div class="line"></div><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> imageName = ((args.length &gt; 0) ? args[0] : <span class="stringliteral">&quot;../data/lena.jpg&quot;</span>);</div><div class="line"></div><div class="line">        src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR); <span class="comment">// Load an image</span></div><div class="line"></div><div class="line">        <span class="comment">// Check if image is loaded fine</span></div><div class="line">        <span class="keywordflow">if</span>( src.empty() ) {</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Error opening image&quot;</span>);</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Program Arguments: [image_name -- default ../data/lena.jpg] \n&quot;</span>);</div><div class="line">            System.exit(-1);</div><div class="line">        }</div><div class="line"></div><div class="line">        <span class="comment">// Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )</span></div><div class="line">        Imgproc.GaussianBlur( src, src, <span class="keyword">new</span> <a class="code" href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">Size</a>(3, 3), 0, 0, Core.BORDER_DEFAULT );</div><div class="line"></div><div class="line">        <span class="comment">// Convert the image to grayscale</span></div><div class="line">        Imgproc.cvtColor( src, src_gray, Imgproc.COLOR_RGB2GRAY );</div><div class="line"></div><div class="line">        Mat abs_dst = <span class="keyword">new</span> Mat();</div><div class="line">        Imgproc.Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT );</div><div class="line"></div><div class="line">        <span class="comment">// converting back to CV_8U</span></div><div class="line">        Core.convertScaleAbs( dst, abs_dst );</div><div class="line"></div><div class="line">        HighGui.imshow( window_name, abs_dst );</div><div class="line">        HighGui.waitKey(0);</div><div class="line"></div><div class="line">        System.exit(0);</div><div class="line">    }</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="keyword">class </span>LaplaceDemo {</div><div class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">void</span> main(<a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a>[] args) {</div><div class="line">        <span class="comment">// Load the native library.</span></div><div class="line">        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);</div><div class="line">        <span class="keyword">new</span> LaplaceDemoRun().run(args);</div><div class="line">    }</div><div class="line">}</div></div><!-- fragment -->  </div> </li>
</ol>
 <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'><ol type="1">
<li>The tutorial code's is shown lines below. You can also download it from <a href="https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/ImgTrans/LaPlace/laplace_demo.py">here</a> <div class="fragment"><div class="line"><span class="stringliteral">&quot;&quot;&quot;</span></div><div class="line"><span class="stringliteral">@file laplace_demo.py</span></div><div class="line"><span class="stringliteral">@brief Sample code showing how to detect edges using the Laplace operator</span></div><div class="line"><span class="stringliteral">&quot;&quot;&quot;</span></div><div class="line"><span class="keyword">import</span> sys</div><div class="line"><span class="keyword">import</span> cv2 <span class="keyword">as</span> cv</div><div class="line"></div><div class="line"><span class="keyword">def </span>main(argv):</div><div class="line">    <span class="comment"># [variables]</span></div><div class="line">    <span class="comment"># Declare the variables we are going to use</span></div><div class="line">    ddepth = cv.CV_16S</div><div class="line">    kernel_size = 3</div><div class="line">    window_name = <span class="stringliteral">&quot;Laplace Demo&quot;</span></div><div class="line">    <span class="comment"># [variables]</span></div><div class="line"></div><div class="line">    <span class="comment"># [load]</span></div><div class="line">    imageName = argv[0] <span class="keywordflow">if</span> len(argv) &gt; 0 <span class="keywordflow">else</span> <span class="stringliteral">&#39;lena.jpg&#39;</span></div><div class="line"></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv.imread</a>(<a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">cv.samples.findFile</a>(imageName), cv.IMREAD_COLOR) <span class="comment"># Load an image</span></div><div class="line"></div><div class="line">    <span class="comment"># Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span> src <span class="keywordflow">is</span> <span class="keywordtype">None</span>:</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Error opening image&#39;</span>)</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Program Arguments: [image_name -- default lena.jpg]&#39;</span>)</div><div class="line">        <span class="keywordflow">return</span> -1</div><div class="line">    <span class="comment"># [load]</span></div><div class="line"></div><div class="line">    <span class="comment"># [reduce_noise]</span></div><div class="line">    <span class="comment"># Remove noise by blurring with a Gaussian filter</span></div><div class="line">    src = <a class="code" href="../../d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1">cv.GaussianBlur</a>(src, (3, 3), 0)</div><div class="line">    <span class="comment"># [reduce_noise]</span></div><div class="line"></div><div class="line">    <span class="comment"># [convert_to_gray]</span></div><div class="line">    <span class="comment"># Convert the image to grayscale</span></div><div class="line">    src_gray = <a class="code" href="../../d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab">cv.cvtColor</a>(src, cv.COLOR_BGR2GRAY)</div><div class="line">    <span class="comment"># [convert_to_gray]</span></div><div class="line"></div><div class="line">    <span class="comment"># Create Window</span></div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5afdf8410934fd099df85c75b2e0888b">cv.namedWindow</a>(window_name, cv.WINDOW_AUTOSIZE)</div><div class="line"></div><div class="line">    <span class="comment"># [laplacian]</span></div><div class="line">    <span class="comment"># Apply Laplace function</span></div><div class="line">    dst = <a class="code" href="../../d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6">cv.Laplacian</a>(src_gray, ddepth, ksize=kernel_size)</div><div class="line">    <span class="comment"># [laplacian]</span></div><div class="line"></div><div class="line">    <span class="comment"># [convert]</span></div><div class="line">    <span class="comment"># converting back to uint8</span></div><div class="line">    abs_dst = <a class="code" href="../../d2/de8/group__core__array.html#ga3460e9c9f37b563ab9dd550c4d8c4e7d">cv.convertScaleAbs</a>(dst)</div><div class="line">    <span class="comment"># [convert]</span></div><div class="line"></div><div class="line">    <span class="comment"># [display]</span></div><div class="line">    <a class="code" href="../../df/d24/group__highgui__opengl.html#gaae7e90aa3415c68dba22a5ff2cefc25d">cv.imshow</a>(window_name, abs_dst)</div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">cv.waitKey</a>(0)</div><div class="line">    <span class="comment"># [display]</span></div><div class="line"></div><div class="line">    <span class="keywordflow">return</span> 0</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> __name__ == <span class="stringliteral">&quot;__main__&quot;</span>:</div><div class="line">    main(sys.argv[1:])</div></div><!-- fragment -->  </div> </li>
</ol>
<h2>Explanation </h2>
<h4>Declare variables</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment">// Declare the variables we are going to use</span></div><div class="line">    Mat src, src_gray, dst;</div><div class="line">    <span class="keywordtype">int</span> kernel_size = 3;</div><div class="line">    <span class="keywordtype">int</span> scale = 1;</div><div class="line">    <span class="keywordtype">int</span> delta = 0;</div><div class="line">    <span class="keywordtype">int</span> ddepth = <a class="code" href="../../d1/d1b/group__core__hal__interface.html#ga9d2ee1a8334733dea7482a47a88e0f87">CV_16S</a>;</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span>* window_name = <span class="stringliteral">&quot;Laplace Demo&quot;</span>;</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <span class="comment">// Declare the variables we are going to use</span></div><div class="line">        Mat src, src_gray = <span class="keyword">new</span> Mat(), dst = <span class="keyword">new</span> Mat();</div><div class="line">        <span class="keywordtype">int</span> kernel_size = 3;</div><div class="line">        <span class="keywordtype">int</span> scale = 1;</div><div class="line">        <span class="keywordtype">int</span> delta = 0;</div><div class="line">        <span class="keywordtype">int</span> ddepth = CvType.CV_16S;</div><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> window_name = <span class="stringliteral">&quot;Laplace Demo&quot;</span>;</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># Declare the variables we are going to use</span></div><div class="line">    ddepth = cv.CV_16S</div><div class="line">    kernel_size = 3</div><div class="line">    window_name = <span class="stringliteral">&quot;Laplace Demo&quot;</span></div></div><!-- fragment --> </div> <h4>Load source image</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = argc &gt;=2 ? argv[1] : <span class="stringliteral">&quot;lena.jpg&quot;</span>;</div><div class="line"></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">imread</a>( <a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">samples::findFile</a>( imageName ), <a class="code" href="../../d8/d6a/group__imgcodecs__flags.html#gga61d9b0126a3e57d9277ac48327799c80af660544735200cbe942eea09232eb822">IMREAD_COLOR</a> ); <span class="comment">// Load an image</span></div><div class="line"></div><div class="line">    <span class="comment">// Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span>(src.empty()){</div><div class="line">        printf(<span class="stringliteral">&quot; Error opening image\n&quot;</span>);</div><div class="line">        printf(<span class="stringliteral">&quot; Program Arguments: [image_name -- default lena.jpg] \n&quot;</span>);</div><div class="line">        <span class="keywordflow">return</span> -1;</div><div class="line">    }</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <a class="code" href="../../dc/d84/group__core__basic.html#ga1f6634802eeadfd7245bc75cf3e216c2">String</a> imageName = ((args.length &gt; 0) ? args[0] : <span class="stringliteral">&quot;../data/lena.jpg&quot;</span>);</div><div class="line"></div><div class="line">        src = Imgcodecs.imread(imageName, Imgcodecs.IMREAD_COLOR); <span class="comment">// Load an image</span></div><div class="line"></div><div class="line">        <span class="comment">// Check if image is loaded fine</span></div><div class="line">        <span class="keywordflow">if</span>( src.empty() ) {</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Error opening image&quot;</span>);</div><div class="line">            System.out.println(<span class="stringliteral">&quot;Program Arguments: [image_name -- default ../data/lena.jpg] \n&quot;</span>);</div><div class="line">            System.exit(-1);</div><div class="line">        }</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    imageName = argv[0] <span class="keywordflow">if</span> len(argv) &gt; 0 <span class="keywordflow">else</span> <span class="stringliteral">&#39;lena.jpg&#39;</span></div><div class="line"></div><div class="line">    src = <a class="code" href="../../d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56">cv.imread</a>(<a class="code" href="../../d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13">cv.samples.findFile</a>(imageName), cv.IMREAD_COLOR) <span class="comment"># Load an image</span></div><div class="line"></div><div class="line">    <span class="comment"># Check if image is loaded fine</span></div><div class="line">    <span class="keywordflow">if</span> src <span class="keywordflow">is</span> <span class="keywordtype">None</span>:</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Error opening image&#39;</span>)</div><div class="line">        <span class="keywordflow">print</span> (<span class="stringliteral">&#39;Program Arguments: [image_name -- default lena.jpg]&#39;</span>)</div><div class="line">        <span class="keywordflow">return</span> -1</div></div><!-- fragment --> </div> <h4>Reduce noise</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment">// Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )</span></div><div class="line">    <a class="code" href="../../d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1">GaussianBlur</a>( src, src, <a class="code" href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">Size</a>(3, 3), 0, 0, <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5afe14c13a4ea8b8e3b3ef399013dbae01">BORDER_DEFAULT</a> );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <span class="comment">// Reduce noise by blurring with a Gaussian filter ( kernel size = 3 )</span></div><div class="line">        Imgproc.GaussianBlur( src, src, <span class="keyword">new</span> <a class="code" href="../../dc/d84/group__core__basic.html#ga346f563897249351a34549137c8532a0">Size</a>(3, 3), 0, 0, Core.BORDER_DEFAULT );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># Remove noise by blurring with a Gaussian filter</span></div><div class="line">    src = <a class="code" href="../../d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1">cv.GaussianBlur</a>(src, (3, 3), 0)</div></div><!-- fragment --> </div> <h4>Grayscale</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <a class="code" href="../../d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab">cvtColor</a>( src, src_gray, <a class="code" href="../../d8/d01/group__imgproc__color__conversions.html#gga4e0972be5de079fed4e3a10e24ef5ef0a353a4b8db9040165db4dacb5bcefb6ea">COLOR_BGR2GRAY</a> ); <span class="comment">// Convert the image to grayscale</span></div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <span class="comment">// Convert the image to grayscale</span></div><div class="line">        Imgproc.cvtColor( src, src_gray, Imgproc.COLOR_RGB2GRAY );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># Convert the image to grayscale</span></div><div class="line">    src_gray = <a class="code" href="../../d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab">cv.cvtColor</a>(src, cv.COLOR_BGR2GRAY)</div></div><!-- fragment --> </div> <h4>Laplacian operator</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <a class="code" href="../../d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6">Laplacian</a>( src_gray, dst, ddepth, kernel_size, scale, delta, <a class="code" href="../../d2/de8/group__core__array.html#gga209f2f4869e304c82d07739337eae7c5afe14c13a4ea8b8e3b3ef399013dbae01">BORDER_DEFAULT</a> );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        Imgproc.Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># Apply Laplace function</span></div><div class="line">    dst = <a class="code" href="../../d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6">cv.Laplacian</a>(src_gray, ddepth, ksize=kernel_size)</div></div><!-- fragment --> </div> <ul>
<li>The arguments are:<ul>
<li><em>src_gray</em>: The input image.</li>
<li><em>dst</em>: Destination (output) image</li>
<li><em>ddepth</em>: Depth of the destination image. Since our input is <em>CV_8U</em> we define <em>ddepth</em> = <em>CV_16S</em> to avoid overflow</li>
<li><em>kernel_size</em>: The kernel size of the Sobel operator to be applied internally. We use 3 in this example.</li>
<li><em>scale</em>, <em>delta</em> and <em>BORDER_DEFAULT</em>: We leave them as default values.</li>
</ul>
</li>
</ul>
<h4>Convert output to a <em>CV_8U</em> image</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment">// converting back to CV_8U</span></div><div class="line">    <a class="code" href="../../d2/de8/group__core__array.html#ga3460e9c9f37b563ab9dd550c4d8c4e7d">convertScaleAbs</a>( dst, abs_dst );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        <span class="comment">// converting back to CV_8U</span></div><div class="line">        Core.convertScaleAbs( dst, abs_dst );</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <span class="comment"># converting back to uint8</span></div><div class="line">    abs_dst = <a class="code" href="../../d2/de8/group__core__array.html#ga3460e9c9f37b563ab9dd550c4d8c4e7d">cv.convertScaleAbs</a>(dst)</div></div><!-- fragment --> </div> <h4>Display the result</h4>
 <div class='newInnerHTML' title='cpp' style='display: none;'>C++</div><div class='toggleable_div label_cpp' style='display: none;'> <div class="fragment"><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563">imshow</a>( window_name, abs_dst );</div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">waitKey</a>(0);</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='java' style='display: none;'>Java</div><div class='toggleable_div label_java' style='display: none;'> <div class="fragment"><div class="line">        HighGui.imshow( window_name, abs_dst );</div><div class="line">        HighGui.waitKey(0);</div></div><!-- fragment --> </div>  <div class='newInnerHTML' title='python' style='display: none;'>Python</div><div class='toggleable_div label_python' style='display: none;'> <div class="fragment"><div class="line">    <a class="code" href="../../df/d24/group__highgui__opengl.html#gaae7e90aa3415c68dba22a5ff2cefc25d">cv.imshow</a>(window_name, abs_dst)</div><div class="line">    <a class="code" href="../../d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7">cv.waitKey</a>(0)</div></div><!-- fragment --> </div> <h2>Results </h2>
<ol type="1">
<li><p class="startli">After compiling the code above, we can run it giving as argument the path to an image. For example, using as an input:</p>
<div class="image">
<img src="../../Laplace_Operator_Tutorial_Original_Image.jpg" alt="Laplace_Operator_Tutorial_Original_Image.jpg"/>
</div>
</li>
<li><p class="startli">We obtain the following result. Notice how the trees and the silhouette of the cow are approximately well defined (except in areas in which the intensity are very similar, i.e. around the cow's head). Also, note that the roof of the house behind the trees (right side) is notoriously marked. This is due to the fact that the contrast is higher in that region.</p>
<div class="image">
<img src="../../Laplace_Operator_Tutorial_Result.jpg" alt="Laplace_Operator_Tutorial_Result.jpg"/>
</div>
 </li>
</ol>
</div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.6-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 2 2021 11:36:35 for OpenCV by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="../../doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
<script type="text/javascript">
//<![CDATA[
addTutorialsButtons();
//]]>
</script>
</body>
</html>
